package 数据结构和算法.剑指offer.树.二叉搜索树的后序遍历序列;

/**
 * 输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true，否则返回 false。
 * 假设输入的数组的任意两个数字都互不相同
 * <p>
 * 遇到树的问题就可以使用递归进行解决。本题采取的是分治递归的思路，
 * 判断所有子树的正确性。首先划分左右子树，找到第一个大于根节点的结点，
 * 索引记为m，此时可以划分出左子树区间[i,m-1]，右子树区间[m,j-1]，根节点索引j
 */
public class Test {
    public static boolean vertifyPostOrder(int[] array) {
        return recur(array, 0, array.length - 1);
    }

    public static boolean recur(int[] array, int i, int j) {
        if (i >= j) {
            return true; //此子树的节点数量<=1
        }
        int p = i;
        while (array[p] < array[j]) {
            p++;
        }
        int m = p;
        while (array[p] > array[j]) {
            j++;
        }

        return p == j && recur(array, i, m - 1) && recur(array, m, j - 1);
    }
}
